#include <REGX52.H>
/**
 * 灯：
 * 密码指示灯 1,2,3,4
 * 操作状态灯 5（红）,6（绿）
 *
 * 按键：
 * 密码输入按键 1,2,3,4
 * 状态切换按键 5
 * 确认按键 6
 * 返回按键 7
 *
 * 状态：
 * 1. 密码输入状态，输入密码按键，
 * 按键1,2,3,4 对应密码指示灯1,2,3,4，
 * 按键按下后对应密码指示灯亮
 * 按照输入的顺序，点亮对应的灯。
 * 按下返回按键7，取消之前的输入
 * 按下确认6，需要确保输入1234灯全部被点亮，代表密码输入正确
 * 密码输入正确后，绿灯亮。
 * 输入返回后，恢复到密码输入状态。
 *
 * 2. 密码设置状态，按下状态切换按键5，切换密码设置状态和密码输入状态
 * 密码设置状态，输入新密码，覆盖之前的密码。密码输入状态下，红色指示灯5亮起
 * 同样点亮1,2,3,4 密码后，输入确认，保存新密码，进入到密码输入状态（红色指示灯灭）
 *
 *
 * 重设密码功能：
 * 输入4个按键，不能重复，如果重复，闪灯警告
 *
 * 输入密码功能：
 * 输入4个按键，不能重复，如果重复，闪灯警告
 * 输入密码错误，闪灯警告
 * 输入正确，亮绿灯。
 * 按键关闭，相当于关闭保险箱
 */
int mod =1;
int i=0;
int j;
int z;
int h=0;
int b[4]={5,6,7,8};
int a[4]={1,2,3,4};
int m=0;

void delay_ms(unsigned int ms)
{
    unsigned int i, j;
    for (i = 0; i < ms; i++)
    {
        for (j = 0; j < 123; j++)
            ;
    }
}

int has_duplicates(int arr[], int size) 
{
    unsigned int i,j;
    for (i = 0; i < size - 1; i++) 
    {
        for ( j = i + 1; j < size; j++)
        {
            if (arr[i] == arr[j])
            {
             return 1;
            }
        }
    }
    return 0;
}

int  arraysEqual(const int arr1[],const int arr2[], int size) 
{
    unsigned int i;
    for ( i = 0; i < size; i++)
    {
        if (arr1[i] != arr2[i])
        {
          return 0;
        }
    }
    return 1;
}

void cd1()
{
  if(P2_0==0)
  {
    while(P2_0==0){}
    P0_0=0;
    b[i++]=1;
  }
}

void cd2()
{
  if(P2_1==0)
  {
    while(P2_1==0){}
    P0_1=0;
    b[i++]=2;
  }
}

void cd3()
{
  if(P2_2==0)
  {
    while(P2_2==0){}
    P0_2=0;
    b[i++]=3;
  }
}

void cd4()
{
  if(P2_3==0)
  {
    while(P2_3==0){}
    P0_3=0;
    b[i++]=4;
  }
}
void mcd1()
{
  if(P2_0==0)
  {
    while(P2_0==0){}
    P0_0=0;
    a[h++]=1;
  }
}
void mcd2()
{
  if(P2_1==0)
  {
    while(P2_1==0){}
    P0_1=0;
    a[h++]=2;
  }
}
void mcd3()
{
  if(P2_2==0)
  {
    while(P2_2==0){}
    P0_2=0;
    a[h++]=3;
  }
}
void mcd4()
{
  if(P2_3==0)
  {
    while(P2_3==0){}
    P0_3=0;
    a[h++]=4;
  }
}


void main()
{
    while(1)
    {
    if(P2_4==0)
    {
     while (P2_4==0){}
     mod = 0;
    }
    if(mod ==1)
    {
      cd1();
      cd2();
      cd3();
      cd4();
      if(P2_5==0)
      {
        while(P2_5==0){}
        mod =2;
      }
      if(has_duplicates(b,4))
      {
       P0_6=0;
       delay_ms(50);
       P0_6=1;   
       delay_ms(50);
      }
      if(P2_6==0)
      {
        while(P2_6==0){}
        i=0;
        P0_0=1;
        P0_1=1;
        P0_2=1;
        P0_3=1;
      }
    }
    if(mod==2)
    {
      if(arraysEqual(b,a,4))
      {
       P0_5=0;
      }else
      {
       P0_6=0;
       delay_ms(50);
       P0_6=1;   
       delay_ms(50);
      }
    }
    if(mod==0)
    {
      if(m==0)
      {
       for(z=0;z<4;z++)
        {
        a[z]=z+5;
        }
        m++;
      }
      P0_4=0;
      mcd1();
      mcd2();
      mcd3();
      mcd4();
      if(has_duplicates(a,4))
      {
       P0_6=0;
       delay_ms(50);
       P0_6=1;   
       delay_ms(50);
      }
      if(P2_5==0)
      {
        while(P2_5==0){}
        P0_0=1;
        P0_1=1;
        P0_2=1;
        P0_3=1;
        mod=1;
        P0_4=1;
      }
      if(P2_6==0)
      {
        while(P2_6==0){}
        for(z=0;z<4;z++)
        {
        a[z]=z+5;
        }
        h=0;
      }
    }
}

}
